/**
 * AntV X6 图形数据提取工具
 * 用于从X6图形实例中提取节点和边的数据结构
 */
// 定义节点数据接口
interface NodeData {
  id: string;
  dataStorage: any;
  shape: string;
}
// 定义边数据接口
interface EdgeData {
  id: string;
  dataStorage: any;
  startNodeId: string;
  endNodeId: string;
  shape: string;
}

// 定义图形数据接口
interface GraphData {
  nodes: NodeData[];
  edges: EdgeData[];
}

// 定义图形元素接口
interface GraphElement {
  shape: string;
  id: string;
  data: any;
  source?: { cell: string };
  target?: { cell: string };
}

/**
 * 从X6图形实例中提取节点和边的数据
 * @param elementGraph - X6图形实例
 * @param nodeTypes - 可选参数，指定要提取的节点类型数组，默认为["node-point", "node-area"]
 * @returns 包含节点和边数据的对象
 */
const extractGraphData = (elementGraph: any, nodeTypes: string[] = ["node-point", "node-area"]): GraphData => {
  try {
    // 获取图形中的所有单元格（节点和边）
    const nodeAndEdge = elementGraph.toJSON().cells || [];
    // 初始化返回数据结构
    const data: GraphData = {
      nodes: [],
      edges: [],
    };
    // 遍历所有单元格，分类提取节点和边的数据
    nodeAndEdge.forEach((item: GraphElement) => {
      // 提取节点数据
      if (nodeTypes.includes(item.shape)) {
        data.nodes.push({
          id: item.id,
          dataStorage: item.data,
          shape: item.shape,
        });
      }

      // 提取边数据
      if (item.shape === "edge" && item.source && item.target) {
        // 确保边的起点和终点都存在
        if (!item.source.cell || !item.target.cell) return;
        
        const params = {
          ...item.data,
          startNodeId: item.source.cell,
          endNodeId: item.target.cell,
        };
        data.edges.push({
          id: item.id,
          dataStorage: params,
          startNodeId: item.source.cell,
          endNodeId: item.target.cell,
          shape: item.shape,
        });
      }
    });
    return data;
  } catch (error) {
    console.error("提取图形数据时发生错误:", error);
    // 发生错误时返回空数据结构
    return { nodes: [], edges: [] };
  }
};
export { extractGraphData };
export type { NodeData, EdgeData, GraphData, GraphElement };
